import {ApprovalStatusEnum} from "../../../constant/ApprovalStatusEnum";

/**
 * 状态机处理器
 */
export default class StatusApprove {
    node:NODE.ApprovalNode;
    constructor(node:NODE.ApprovalNode) {
        this.node = node;
    }
    // 根据返回审批状态选择相应
     processMethod(): void {
         const {status} = this.node;
         switch (status) {
             case ApprovalStatusEnum.SUBMIT:
                 break;
             case ApprovalStatusEnum.AGREE:
                 break;
             case ApprovalStatusEnum.REFUSE:
                 break;
             case ApprovalStatusEnum.REPETITION:
                 break;
             case ApprovalStatusEnum.WITHDRAW:
                 break;
             case ApprovalStatusEnum.REJECT:
                 break;
             default:
                 break;
         }
    }

    // 发起者第一次提交,流程继续
    submit():void{
        // 流程继续,通知下一位
        this.next();

    }
    // 审批者同意,流程继续
    agree():void{
        const {next, parentId, isAnd} = this.node;
        if (next){
            if (Boolean(parentId) && isAnd){
                // TODO 根据 parentId 获取所有记录, 判断记录是都为同意(1)

            }else {
                this.next();
            }
            this.notifyInitiator();
        }else {
            this.done();
        }


    }
    // 审批者拒绝,结束流程
    refuse():void{
        // 结束流程
        this.done();
        // 通知发起人
        this.notifyInitiator()

    }
    // 发起人撤回流程,流程回滚
    withdraw():void{
        this.restoreStatus();
    }
    // 发起人重交
    repetition():void{
        this.submit();
    }
    // 审批者驳回,流程回滚
    reject(): void{
        this.restoreStatus();
        this.notifyInitiator();
    }
    // 流程继续
    next():void{
        const {status, id} = this.node;
        // 修改节点状态为

        // 提醒下一个审批人
        this.notifyNext()
    }

    // 还原流程状态
    restoreStatus():void{
        const {head} = this.node;
        // 根据头节点还原所有节点状态
    };

    // 通知发起人
    notifyInitiator():void{
        const {status, next} = this.node;
        // 根据节点,状态确定消息类型


    }

    // 通知下个节点审批者
    notifyNext(): void{}

    // 结束流程
    done():void{

        const {status, trail} = this.node;
        // TODO 根据尾节点 id 修改尾节点状态

        // 通知发起人
        this.notifyInitiator();


    }


}
